﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Framework.AcessoDados.Acesso;
using Framework.Entidade.Acesso;
using Framework.Util.Enumerador;
using System.Configuration;

namespace Framework.LogicaNegocio.Acesso
{
    public class LN_Funcionalidade
    {
        #region Métodos

        /// <summary>
        /// Método responsável pela listagem de todos os Funcionalidades já cadastrados conforme filtro
        /// </summary>
        /// <param name="idPai">Id Pai da Funcionalidade</param>
        /// <param name="titulo">Título da Funcionalidade</param>
        /// <param name="status">Status da Funcionalidade</param>
        /// <returns>Lista de Objetos EN_Funcionalidade preenchidos</returns>
        public List<EN_Funcionalidade> Listar(int idPai, string titulo, string status)
        {
            AD_Funcionalidade objFuncionalidadeAD = new AD_Funcionalidade();
            List<EN_Funcionalidade> lstFuncionalidades = new List<EN_Funcionalidade>();

            try
            {
                lstFuncionalidades = objFuncionalidadeAD.Listar(idPai, titulo, status);

                foreach (EN_Funcionalidade objFuncionalidade in lstFuncionalidades)
                {
                    if (objFuncionalidade.IdPai > 0)
                        objFuncionalidade.FuncionalidadePai = this.RetornarFuncionalidade(objFuncionalidade.IdPai, string.Empty);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return lstFuncionalidades;
        }

        /// <summary>
        /// Método responsável pela listagem das Funcionalidades associadas ao Grupo
        /// </summary>
        /// <param name="idGrupo">Id do Grupo</param>
        /// <param name="status">Status da Funcionalidade</param>
        /// <returns>Lista de Objetos EN_Funcionalidade preenchidos</returns>
        public List<EN_Funcionalidade> ListarFuncionalidadePorGrupo(int idGrupo, string status)
        {
            AD_Funcionalidade objFuncionalidadeAD = new AD_Funcionalidade();
            List<EN_Funcionalidade> lstFuncionalidades = new List<EN_Funcionalidade>();

            try
            {
                lstFuncionalidades = objFuncionalidadeAD.ListarFuncionalidadePorGrupo(idGrupo, status);

                foreach (EN_Funcionalidade objFuncionalidade in lstFuncionalidades)
                {
                    if (objFuncionalidade.IdPai > 0)
                        objFuncionalidade.FuncionalidadePai = this.RetornarFuncionalidade(objFuncionalidade.IdPai, string.Empty);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return lstFuncionalidades;
        }

        /// <summary>
        /// Método responsável pela listagem de todos os Funcionalidades já cadastrados conforme filtro
        /// </summary>
        /// <param name="status">Status da Funcionalidade</param>
        /// <returns>Lista de Objetos EN_Funcionalidade preenchidos</returns>
        public List<EN_Funcionalidade> ListarPrincipais(string status)
        {
            AD_Funcionalidade objFuncionalidadeAD = new AD_Funcionalidade();
            List<EN_Funcionalidade> lstFuncionalidades = new List<EN_Funcionalidade>();

            try
            {
                lstFuncionalidades = objFuncionalidadeAD.ListarPrincipais(status);

                foreach (EN_Funcionalidade objFuncionalidade in lstFuncionalidades)
                {
                    if (objFuncionalidade.IdPai > 0)
                        objFuncionalidade.FuncionalidadePai = this.RetornarFuncionalidade(objFuncionalidade.IdPai, string.Empty);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return lstFuncionalidades;
        }

        /// <summary>
        /// Método responsável pelo retorno da Funcionalidade desejado
        /// </summary>
        /// <param name="id">id da Funcionalidade</param>
        /// <param name="destino">Destino da Funcionalidade</param>
        /// <returns>Objeto EN_Funcionalidade preenchido</returns>
        public EN_Funcionalidade RetornarFuncionalidade(int id, string destino)
        {
            AD_Funcionalidade objFuncionalidadeAD = new AD_Funcionalidade();
            EN_Funcionalidade objFuncionalidade = new EN_Funcionalidade();

            try
            {
                if (id <= 0 && string.IsNullOrEmpty(destino) == true)
                    throw new Exception("Informe o Id e/ou o Destino da Funcionalidade.");

                objFuncionalidade = objFuncionalidadeAD.RetornarFuncionalidade(id, destino);

                if (objFuncionalidade.IdPai > 0)
                    objFuncionalidade.FuncionalidadePai = this.RetornarFuncionalidade(objFuncionalidade.IdPai, string.Empty);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return objFuncionalidade;
        }

        /// <summary>
        /// Método responsável por Salvar o Funcionalidade no Banco de Dados
        /// Insere ou Altera
        /// </summary>
        /// <param name="objFuncionalidade">Objeto Funcionalidade preenchido</param>
        /// <returns>Id da Funcionalidade</returns>
        public int Salvar(EN_Funcionalidade objFuncionalidade)
        {
            AD_Funcionalidade objFuncionalidadeAD = new AD_Funcionalidade();
            int idFuncionalidade = 0;

            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["FrameworkConnectionDev"].ConnectionString))
            {
                conn.Open();
                //Iniciando uma transação
                SqlTransaction trans = conn.BeginTransaction();

                try
                {
                    if (objFuncionalidade == null)
                        throw new Exception("Preencha as informações da Funcionalidade.");
                    if (string.IsNullOrEmpty(objFuncionalidade.Titulo) == true)
                        throw new Exception("Informe o Título da Funcionalidade.");
                    if (string.IsNullOrEmpty(objFuncionalidade.Descricao) == true)
                        throw new Exception("Informe a Descrição da Funcionalidade.");
                    if (string.IsNullOrEmpty(objFuncionalidade.Resumo) == true)
                        throw new Exception("Informe o Resumo da Funcionalidade.");
                    if (string.IsNullOrEmpty(objFuncionalidade.Destino) == true)
                        throw new Exception("Informe o Destino da Funcionalidade.");
                    if (string.IsNullOrEmpty(objFuncionalidade.Tipo) == true)
                        throw new Exception("Informe o Tipo da Funcionalidade.");
                    if (objFuncionalidade.Ordem < 0)
                        throw new Exception("Informe a Ordem da Funcionalidade.");

                    idFuncionalidade = objFuncionalidadeAD.Salvar(objFuncionalidade, conn, trans);

                    trans.Commit();
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    throw ex;
                }

                conn.Close();
            }

            return idFuncionalidade;
        }

        /// <summary>
        /// Método responsável por Excluir/Inativar o Funcionalidade desejado
        /// </summary>
        /// <param name="id">id da Funcionalidade</param>
        public void Excluir(int id)
        {
            AD_Funcionalidade objFuncionalidadeAD = new AD_Funcionalidade();

            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["FrameworkConnectionDev"].ConnectionString))
            {
                conn.Open();
                //Iniciando uma transação
                SqlTransaction trans = conn.BeginTransaction();

                try
                {
                    if (id <= 0)
                        throw new Exception("Informe o Id da Funcionalidade.");

                    objFuncionalidadeAD.Excluir(id, conn, trans);
                    trans.Commit();
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    throw ex;
                }

                conn.Close();
            }
        }

        #endregion
    }
}
